home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / ATUtilities.lha / ATUtilities / joy.c < prev    next >
C/C++ Source or Header  |  2000-09-26  |  8KB  |  384 lines

  1. /* ******************************************************************* */
  2. /* **                                                               ** */
  3. /* **                   ATUtilities Joystick Manager                ** */
  4. /* **            Copright (C) 1992-1994 by Thomas Dreibholz         ** */
  5. /* **                      All rights reserved                      ** */
  6. /* **                                                               ** */
  7. /* ******************************************************************* */
  8.  
  9. #include "janus.h"
  10. #include "ATUtilities.h"
  11.  
  12. #define XOR(a,b) ((a || b) && !(a && b))
  13. #define BIT0 (1<<0)
  14. #define BIT1 (1<<1)
  15. #define BIT4 (1<<4)
  16. #define BIT5 (1<<5)
  17. #define BIT6 (1<<6)
  18. #define BIT7 (1<<7)
  19. #define BIT8 (1<<8)
  20. #define BIT9 (1<<9)
  21.  
  22. UBYTE *JoyPort="ATUtilities Joystick-Manager";
  23. UBYTE *PrefsName="AT:Prefs/JoystickManager.prefs";
  24. UBYTE *HelpName="AT:Help/JoystickManager.help";
  25.  
  26. struct JoyPrefs
  27. {
  28.  UBYTE JoystickB;
  29.  UBYTE Fire12;
  30. };
  31.  
  32. struct JoyPrefs JoyPrefs={1,1};
  33.  
  34. struct JanusBase *JanusBase;
  35. struct Library   *GfxBase;
  36. struct Library   *IntuitionBase;
  37. struct Library   *ATUtilitiesBase;
  38.  
  39. struct AppManager   *app;
  40. struct Message      *AppMessage;
  41. struct ExtSetupSig  *ExtSetupSig;
  42. struct Window       *WindowPtr;
  43. struct RastPort     *rp;
  44. struct CommMemory   *jhbyte,*jhword;
  45.  
  46. LONG  JanusSignal;
  47. LONG  PortSignal;
  48. ULONG JanusSignalMask;
  49. ULONG PortSignalMask;
  50. ULONG AppSignalMask;
  51. ULONG WaitSignalMask;
  52. ULONG Signale;
  53.  
  54. WORD jx,jy;
  55.  
  56. VOID  HandleInt();
  57. VOID  ShowInfo();
  58. VOID  OpenAll();
  59. VOID  CloseAll();
  60. BOOL  EinstellungenAendern();
  61. UWORD GetJoystick();
  62. UBYTE GetCIA();
  63.  
  64. struct MsgPort  *Port;
  65.  
  66.  
  67. /* Installationsroutine */
  68. VOID main()
  69. {
  70.  REGISTER UWORD        i;
  71.  REGISTER BOOL         bool;
  72.  
  73.  OpenAll();
  74.  bool=FALSE;
  75.  jx=180;
  76.  jy=120;
  77.  while(bool==FALSE)
  78.   {
  79.    Signale=Wait(WaitSignalMask);
  80.    if(Signale & PortSignalMask)
  81.     {
  82.      i=Received(Port);
  83.      switch(i)
  84.       {
  85.        case UTILITY_CALL:
  86.          bool=EinstellungenAendern();
  87.         break;
  88.        case UTILITY_QUIT:
  89.          bool=ExitWarning();
  90.         break;
  91.        case UTILITY_INFO:
  92.          ShowInfo();
  93.         break;
  94.        case UTILITY_HELP:
  95.          Help(HelpName,0);
  96.         break;
  97.       }
  98.     }
  99.    if(Signale & JanusSignalMask)
  100.     {
  101.      HandleInt();
  102.     }
  103.    if(app!=NULL)
  104.     {
  105.      if(Signale & AppSignalMask)
  106.       {
  107.        AppMessage=GetMsg(app->Port);
  108.        if(AppMessage!=NULL)
  109.         {
  110.          ReplyMsg(AppMessage);
  111.          bool=EinstellungenAendern();
  112.         }
  113.       }
  114.     }
  115.   }
  116.  CloseAll();
  117. }
  118.  
  119.  
  120. #asm
  121.    public _GetJoystick
  122. _GetJoystick:
  123.    clr.l d0
  124.    move.w $dff00c,d0
  125.    rts
  126.    public _GetCIA
  127. _GetCIA:
  128.    clr.l d0
  129.    move.b $bfe001,d0
  130.    rts
  131. #endasm
  132.  
  133.  
  134. /* PC-Befehle ausführen */
  135. VOID HandleInt()
  136. {
  137.  REGISTER UWORD joydat;
  138.  REGISTER ULONG mem;
  139.  REGISTER UWORD i,j;
  140.  REGISTER UWORD cia;
  141.  
  142.  switch(jhword->Arg1)
  143.   {
  144.    case 1:
  145.      joydat=GetJoystick();
  146.      if(joydat & BIT1)
  147.       {
  148.        jx+=60;
  149.        if(jx>360) jx=360;
  150.       }
  151.      if(joydat & BIT9)
  152.       {
  153.        jx-=60;
  154.        if(jx<0) jx=0;
  155.       }
  156.      if(XOR((joydat & BIT8),(joydat & BIT9)))
  157.       {
  158.        jy-=60;
  159.        if(jy<0) jy=0;
  160.       }
  161.      if(XOR((joydat & BIT0),(joydat & BIT1)))
  162.       {
  163.        jy+=60;
  164.        if(jy>240) jy=240;
  165.       }
  166.      if(JoyPrefs.JoystickB)
  167.       {
  168.        jhword->Arg4=jx;
  169.        jhword->Arg5=jy;
  170.       }
  171.      else
  172.       {
  173.        jhword->Arg2=jx;
  174.        jhword->Arg3=jy;
  175.       }
  176.     break;
  177.    case 2:
  178.      cia=GetCIA();
  179.      if(!(cia & BIT7))
  180.       {
  181.        if(JoyPrefs.JoystickB)
  182.         {
  183.          if(JoyPrefs.Fire12)
  184.            jhword->Arg2 &= (0xffff-BIT7-BIT6);
  185.          else
  186.            jhword->Arg2 &= (0xffff-BIT6);
  187.         }
  188.        else
  189.         {
  190.          if(JoyPrefs.Fire12)
  191.            jhword->Arg2 &= (0xffff-BIT4-BIT5);
  192.          else
  193.            jhword->Arg2 &= (0xffff-BIT4);
  194.         }
  195.       }
  196.     break;
  197.    case 3:
  198.      jx=180;
  199.      jy=120;
  200.     break;
  201.   }
  202.  SendJanusInt(28);
  203. }
  204.  
  205.  
  206. /* Installationsroutine */
  207. VOID OpenAll()
  208. {
  209.  REGISTER UWORD              i;
  210.  register struct MsgPort    *p;
  211.  register struct FileHandle *fh;
  212.  
  213.  ATUtilitiesBase=OpenLibrary("at-utilities.library",0L);
  214.  if(ATUtilitiesBase==NULL)
  215.   {
  216.    printf("FEHLER: Kann ATUtilities-Library nicht öffnen.\n");
  217.    CloseAll();
  218.   }
  219.  
  220.  GfxBase=OpenLibrary("graphics.library",0L);
  221.  IntuitionBase=OpenLibrary("intuition.library",0L);
  222.  if((GfxBase==NULL)||(IntuitionBase==NULL))
  223.   {
  224.    CloseAll();
  225.   }
  226.  
  227.  p=FindPort(JoyPort);
  228.  if(p!=NULL)
  229.   {
  230.    InfoRequest("ATUtilities Joystick-Handler ist schon aktiv.");
  231.    CloseAll();
  232.   }
  233.  
  234.  JanusBase=OpenLibrary("janus.library",0L);
  235.  if(JanusBase==NULL)
  236.   {
  237.    ErrorRequest(ERROR_JANUS);
  238.    CloseAll();
  239.   }
  240.  
  241.  Port=CreatePort(JoyPort,0L);
  242.  if(Port==NULL)
  243.   {
  244.   ErrorRequest(ERROR_MPORT);
  245.   CloseAll();
  246.   }
  247.  
  248.  fh=Open(PrefsName,MODE_OLDFILE);
  249.  if(fh!=NULL)
  250.   {
  251.    Read(fh,&JoyPrefs,sizeof(struct JoyPrefs));
  252.    Close(fh);
  253.   }
  254.  
  255.  ExtSetupSig=CreatePublicHandler(28);
  256.  if(ExtSetupSig==NULL)
  257.   {
  258.    CloseAll();
  259.   }
  260.  
  261.  app=CreateAppItem("ATUtilities Joystick-Manager");
  262.  if(app!=NULL) AppSignalMask=app->SignalMask; else AppSignalMask=0;
  263.  
  264.  jhword=ExtSetupSig->WordAccess;
  265.  jhbyte=ExtSetupSig->ByteAccess;
  266.  PortSignal=Port->mp_SigBit;
  267.  PortSignalMask=(1L<<PortSignal);
  268.  JanusSignal=ExtSetupSig->JanusSignal;
  269.  JanusSignalMask=ExtSetupSig->JanusSignalMask;
  270.  WaitSignalMask=PortSignalMask+JanusSignalMask+AppSignalMask;
  271.  ChangeTaskPri(10);
  272. }
  273.  
  274.  
  275. /* Programmende */
  276. VOID CloseAll()
  277. {
  278.  if(ExtSetupSig) DeletePublicHandler(ExtSetupSig);
  279.  if(Port) DeletePort(Port);
  280.  if(ATUtilitiesBase) CloseLibrary(ATUtilitiesBase);
  281.  if(GfxBase) CloseLibrary(GfxBase);
  282.  if(IntuitionBase) CloseLibrary(IntuitionBase);
  283.  if(JanusBase) CloseLibrary(JanusBase);
  284.  exit(0);
  285. }
  286.  
  287.  
  288. /* Einstellungsfenster */
  289. BOOL EinstellungenAendern()
  290. {
  291.  REGISTER BOOL                 bool,ende;
  292.  REGISTER ULONG                Class;
  293.  register struct Window       *win;
  294.  register struct Gadget       *t1,*t2,*gad;
  295.  register struct IntuiMessage *msg;
  296.  register struct FileHandle   *fh;
  297.  register struct RastPort     *rp;
  298.  register struct TextFont     *opal;
  299.  UBYTE *tex1="Emuliere Joystick als PC-Joystick in Port B";
  300.  UBYTE *tex2="Sende immer beide Feuertasten";
  301.  
  302.  bool=FALSE;
  303.  win=CreateStdWindow("ATUtilities - Joystick-Manager Einstellungen",
  304.                      75,75,450,57+BorderHeight(),GADGETUP|CLOSEWINDOW,
  305.                      WINDOWCLOSE|WINDOWDEPTH|WINDOWDRAG|ACTIVATE|GIMMEZEROZERO);
  306.  if(win!=NULL)
  307.   {
  308.    rp=win->RPort;
  309.    opal=GetOpalFont();
  310.    SetFont(rp,opal);
  311.    CreateBoolGadget(win,10,5,155,12,"Einstellungen okay",1);
  312.    CreateBoolGadget(win,170,5,155,12,"Programm beenden",2);
  313.    CreateBoolGadget(win,335,5,50,12,"Info",3);
  314.    CreateBoolGadget(win,390,5,50,12,"Hilfe",4);
  315.    if(JoyPrefs.JoystickB)
  316.      t1=CreateSToggleGadget(win,10,25,430,12,tex1,10);
  317.    else
  318.      t1=CreateNToggleGadget(win,10,25,430,12,tex1,10);
  319.    if(JoyPrefs.Fire12)
  320.      t2=CreateSToggleGadget(win,10,40,430,12,tex2,20);
  321.    else
  322.      t2=CreateNToggleGadget(win,10,40,430,12,tex2,20);
  323.    ende=FALSE;
  324.    while(ende==FALSE)
  325.     {
  326.      WaitPort(win->UserPort);
  327.      msg=GetMsg(win->UserPort);
  328.      gad=msg->IAddress;
  329.      Class=msg->Class;
  330.      ReplyMsg(msg);
  331.      switch(Class)
  332.       {
  333.        case CLOSEWINDOW:
  334.          ende=TRUE;
  335.         break;
  336.        case GADGETUP:
  337.          switch(gad->GadgetID)
  338.           {
  339.            case 1:
  340.              if(t1->Flags & SELECTED) JoyPrefs.JoystickB=1; else JoyPrefs.JoystickB=0;
  341.              if(t2->Flags & SELECTED) JoyPrefs.Fire12=1; else JoyPrefs.Fire12=0;
  342.              ende=TRUE;
  343.             break;
  344.            case 2:
  345.              ende=TRUE; bool=TRUE;
  346.             break;
  347.            case 3:
  348.              ShowInfo();
  349.             break;
  350.            case 4:
  351.              Help(HelpName,0);
  352.             break;
  353.           }
  354.         break;
  355.       }
  356.     }
  357.    DeleteStdWindow(win);
  358.    if(bool==TRUE)
  359.     {
  360.      fh=Open(PrefsName,MODE_NEWFILE);
  361.      if(fh!=NULL)
  362.       {
  363.        Write(fh,&JoyPrefs,sizeof(struct JoyPrefs));
  364.        Close(fh);
  365.       }
  366.     }
  367.   }
  368.  if(bool==TRUE) bool=ExitWarning();
  369.  return(bool);
  370. }
  371.  
  372.  
  373. /* Information */
  374. VOID ShowInfo()
  375. {
  376.  InformationBox("ATUtilities Joystick-Manager - Information",
  377.                 "$VER: Joystick-Manager - Version 4.0",
  378.                 "Copyright (C) 1992-1994 by",
  379.                 "Thomas Dreibholz",
  380.                 "All rights reserved.",
  381.                 "AT:Icons/Utility");
  382. }
  383.  
  384.